package com.kexilo.system.audit.service;



import com.kexilo.core.audit.domain.SysArchiveConfig;
import com.kexilo.core.audit.domain.SysDataArchive;

import java.util.List;
import java.util.Map;

/**
 * 数据归档服务接口
 *
 * @author Kexilo
 */
public interface IDataArchiveService {

    /**
     * 执行数据归档
     *
     * @param config 归档配置
     * @return 归档记录
     */
    SysDataArchive executeArchive(SysArchiveConfig config);

    /**
     * 手动执行数据归档
     *
     * @param configId 配置ID
     * @return 归档记录ID
     */
    Long manualArchive(Long configId);

    /**
     * 批量归档（定时任务调用）
     *
     * @return 执行结果
     */
    Map<String, Object> batchArchive();

    /**
     * 查询归档记录列表
     *
     * @param archive 查询条件
     * @return 归档记录列表
     */
    List<SysDataArchive> selectArchiveList(SysDataArchive archive);

    /**
     * 根据ID查询归档记录
     *
     * @param archiveId 归档ID
     * @return 归档记录
     */
    SysDataArchive selectArchiveById(Long archiveId);

    /**
     * 删除归档记录
     *
     * @param archiveIds 归档ID数组
     * @return 影响行数
     */
    int deleteArchiveByIds(Long[] archiveIds);

    /**
     * 查询归档统计信息
     *
     * @param days 天数
     * @return 统计信息
     */
    Map<String, Object> getArchiveStatistics(int days);

    /**
     * 清理过期归档记录
     *
     * @param retentionDays 保留天数
     * @return 清理数量
     */
    int cleanExpiredArchiveRecords(int retentionDays);

    /**
     * 检查数据表是否存在
     *
     * @param tableName 表名
     * @return 是否存在
     */
    boolean checkTableExists(String tableName);

    /**
     * 验证归档条件SQL
     *
     * @param tableName 表名
     * @param condition 条件
     * @return 验证结果
     */
    Map<String, Object> validateArchiveCondition(String tableName, String condition);

    /**
     * 预览待归档数据
     *
     * @param tableName 表名
     * @param condition 条件
     * @param limit 限制数量
     * @return 预览结果
     */
    Map<String, Object> previewArchiveData(String tableName, String condition, int limit);

    /**
     * 停止正在运行的归档任务
     *
     * @param archiveId 归档ID
     * @return 是否成功
     */
    boolean stopArchiveTask(Long archiveId);
}
